﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Oracle.DataAccess.Client;

namespace GestionCegep.Objects
{
    // Classe permettant la generation des rapports 
    public class Rapport
    {
        private const char SEPARATOR = ';'; // Ce qui separe chacune des donnees dans le rapport en sortie

        private string nomRapport;   // Nom du rapport
        private string nomFichier;   // Nom du fichier dans lequel se trouvera le rapport
        private string requete;      // Requete a la base de données pour generer le rapport
        private string destination;  // Destination du rapport

        // Constructeur
        public Rapport(string nom, string requete, string destination)
        {
            this.nomRapport = nom;
            this.nomFichier = Path.ChangeExtension(nom, ".csv");
            this.requete = requete;
            this.destination = destination;
        }

        public string NomRapport { get { return nomRapport; } }
        public string Requete { get { return requete; } }
        public string Destination { get { return destination; } }
        public string FullDestinationName { get { return destination + @"\" + nomFichier; } }

        public bool GenererRapport(OracleConnection connection)
        {
            OracleCommand command;    
            OracleDataReader dataReader;
            string lineToWrite = String.Empty;
            try
            {
                command = connection.CreateCommand(); // Creation de la commande Oracle
                command.CommandText = requete; // Requête a la base de données specifie dans la classe Rapports.cs
                connection.Open(); // Ouverture de la connexion

                dataReader = command.ExecuteReader(); // Execution de la requete

                if (!dataReader.HasRows) // S'il n'y a aucune donnees
                    return false;
                else
                {
                    using (StreamWriter writer = new StreamWriter(FullDestinationName, false, Encoding.UTF8)) // Ecriture dans un fichier
                    {
                        for (int ctr = 0; ctr < dataReader.FieldCount; ctr++)
                        {
                            lineToWrite += dataReader.GetName(ctr) + SEPARATOR;
                        }
                        //Enleve le dernier separateur
                        lineToWrite = lineToWrite.Substring(0, lineToWrite.Length - 1);
                        writer.WriteLine(lineToWrite);
                        
                        // Tant qu'il y a des donnees...
                        while (dataReader.Read())
                        {
                            lineToWrite = String.Empty;
                            for (int ctr = 0; ctr < dataReader.FieldCount; ctr++)
                            {
                                lineToWrite += dataReader[ctr].ToString() + SEPARATOR;
                            }
                            //Enleve le dernier separateur
                            lineToWrite = lineToWrite.Substring(0, lineToWrite.Length - 1);
                            writer.WriteLine(lineToWrite);
                        }
                        writer.Flush(); // On vide le tampon
                    }
                }
                
            }
            catch (OracleException oraException)
            {
                connection.Close(); // Fermeture de la connexion
                throw oraException;
            }
            catch (IOException ioException)
            {
                connection.Close(); // Fermeture de la connexion
                throw ioException;
            }
            catch (Exception exception)
            {
                connection.Close(); // Fermeture de la connexion
                throw exception;
            }
            connection.Close(); // Fermeture de la connexion
            return true;
        }
    }
}
